#ifndef GLOBAL_H
#define GLOBAL_H

#include "StdAfx.h"
#include "command.h"

typedef list<string> PARAMETERS;
typedef string (*OPERA_FUNC)(const PARAMETERS&);
typedef pair<string, PARAMETERS> PARAMETERS_PAIR;
typedef map<string, OPERA_FUNC> OPERATOR_MAP;
typedef struct __tagCustomFunc {
    string name;
    PARAMETERS args;
    string statement;
} FUNCTION;
typedef list<FUNCTION> FUNC_LIST;
typedef map<string, string> VARIABLE_MAP;

static VARIABLE_MAP g_variable_map;

string* findVariable(const string& name);
string insertVariable(const string& name, const string& value);

extern void initOperator();
extern OPERA_FUNC findOperator(const string& name);
extern FUNCTION* findFunction(const string& name);
extern string evalFunction(const FUNCTION* func, const PARAMETERS& args);

void initExtension();

bool isspace(char ch);
bool isspecial(const string& str);
bool isnumber(const string& str);
bool isvariable(const string& str);
bool isatom(const string& str);
bool matchbrackets(const string& str);

string getNextElement(const string& str, size_t pos);
string& trim(string& str);

PARAMETERS getListArgument(const string& str);
PARAMETERS_PAIR getListOpera(const string& str);
bool getBool(const string& str);
FUNCTION getFunction(const PARAMETERS& args);

void evalCmd(const string& str);
string evalList(const string& str);
string eval(const string& str);


string constructList(const PARAMETERS& lst);
string constructBool(bool b);


#endif // GLOBAL_H